/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package caintra.Sapra.Pantalla.Empresa;

import caintra.Sapra.Model.Calendariofacturacionpracticantes;
import caintra.Sapra.Model.Empresa;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import nextapp.echo2.app.event.ActionEvent;
import nextapp.echo2.app.event.ActionListener;
import nextapp.echo2.app.filetransfer.UploadEvent;
import nextapp.echo2.app.filetransfer.UploadListener;
import nextapp.echo2.app.list.DefaultListModel;
import org.sapra.dao.Aseguradora;
import org.sapra.dao.Banco;
import org.sapra.dao.Esquemapagopracticante;
import org.sapra.dao.GpoEmpresas;

/**
 *
 * @author luiz
 */
public class EmpresaController {
    public EmpresaView vista;
    public Empresa empresa,em_aux;
    public EmpresaQuery query;
    public List<Empresa> empresas;
    public List<Banco> bancos;
    public List<Aseguradora> seguros;
    public List<Esquemapagopracticante> esquema_pago;
    public List<GpoEmpresas> gpo_empresas;
    public SimpleDateFormat formato_cadena=new SimpleDateFormat("dd/MM/yyyy");
    public ArrayList<Calendariofacturacionpracticantes> lista_fechas=new ArrayList<Calendariofacturacionpracticantes>();
    
    public EmpresaController(EmpresaView vista){
        try {
            this.vista = vista;
            query = new EmpresaQuery();
            execute();
            
        } catch (Exception e) {
            
        }finally{
            System.gc();
        }  
    }
    
    public void execute(){
        try {
            action();
            reiniciar_campo();
            vista.col_empresa.setVisible(false);
            vista.col_info.setVisible(false);
            vista.col_direccion.setVisible(false);
            vista.guardar.setVisible(false);
        } catch (Exception e) {
        }
        
        
    }
    public void action(){
        vista.nuevo.addActionListener( new ActionListener(){public void actionPerformed(ActionEvent e) {nuevo();}});
        vista.editar.addActionListener( new ActionListener(){public void actionPerformed(ActionEvent e) {editar();}});
        vista.guardar.addActionListener( new ActionListener(){public void actionPerformed(ActionEvent e) {guardar();}});
        vista.ver.addActionListener( new ActionListener(){public void actionPerformed(ActionEvent e) {ver();}});
        vista.sel_lista_empresa.addActionListener( new ActionListener(){public void actionPerformed(ActionEvent e) {sel_empresa();}});
        try{
        vista.cargar_archivo.addUploadListener(new UploadListener() {

                public void fileUpload(UploadEvent ue) {
                    try {
                        String nameFile=ue.getFileName();
                             String fechaStr="";
                             byte[] b = new byte[ue.getSize()];
                             ue.getInputStream().read(b, 0, ue.getSize());
                             String path=setContent(b);
                             File f=new File(path);
                             FileOutputStream outputStream = new FileOutputStream(f);
                             outputStream.write(b);
                             outputStream.close();
                             BufferedReader r=new BufferedReader(new FileReader(f));
                             r.readLine();
                             boolean bandera_fecha=false;
                             lista_fechas=new ArrayList<Calendariofacturacionpracticantes>();
                             while(true){
                                 try {
                                     fechaStr=r.readLine();
                                     if (fechaStr == null || fechaStr.trim().equals(""))
                                            break;
                                     else{
                                         bandera_fecha = Lista_Fecha(fechaStr);
                                         if(bandera_fecha == false){
                                             lista_fechas=new ArrayList<Calendariofacturacionpracticantes>();
                                             return;
                                         }
                                     }
                                         
                                 } catch (Exception e) {
                                     lista_fechas=new ArrayList<Calendariofacturacionpracticantes>();
                                 }
                             }
                             
                             r.close();
                             f.delete();
                             f.deleteOnExit();
                             
                    } catch (Exception e) {
                    }
                }

                public void invalidFileUpload(UploadEvent uploadEvent) {
                    try {
                        lista_fechas=new ArrayList<Calendariofacturacionpracticantes>();
                    } catch (Exception e) {
                    }

                }
            });}catch(Exception e){
                
            }
    }
    public String setContent(byte[] content) throws IOException {
        File tmpFile = File.createTempFile(String.valueOf(System
                .currentTimeMillis()), null);
        // Ejecuta correctamente y borra archivos cuando la aplicación se denga...
        tmpFile.deleteOnExit();        
        String path = tmpFile.getCanonicalPath();
        FileOutputStream outputStream = new FileOutputStream(tmpFile);
        outputStream.write(content);
        outputStream.close();
        return path;
    }

    public void ver(){
        try {
            this.vista.calendarios_window.setContentPane(new Cal_FacturaView(this));
             this.vista.calendarios_window.setVisible(true);
             this.vista.add(this.vista.calendarios_window);
            
        } catch (Exception e) {
        }
    }
    public void nuevo(){
        vista.col_empresa.setVisible(false);
        vista.col_info.setVisible(true);
        vista.col_direccion.setVisible(true);
        empresa = null;
        vista.direccion_view.setData();
        reiniciar_campo();
        vista.guardar.setVisible(true);
        lista_fechas = new ArrayList<Calendariofacturacionpracticantes>();
    }
    public void editar(){
        vista.col_empresa.setVisible(true);
        vista.col_info.setVisible(false);
        vista.col_direccion.setVisible(false);
        reiniciar_campo();
        vista.guardar.setVisible(false);
        empresa = null;
        lista_fechas = new ArrayList<Calendariofacturacionpracticantes>();
    }
    public void guardar(){
        String msj=validar();
        int direccion_id=0;
        int response=0;
        if(msj== null){
            msj=setEmpresa();
            if(msj != null){
                    mensaje_error(msj);
                    return;
            }else{
                if(empresa == null){
                    direccion_id=vista.direccion_view.pre_insert(0);
                }else{
                    direccion_id=vista.direccion_view.pre_insert(empresa.getFk_direccionId());
                }
                if(direccion_id <= 0){
                    mensaje_error("Error al guardar la direccion");
                    return;
                }
                em_aux.setFk_direccionId(direccion_id);
                if(empresa == null)
                    response = query.insert(em_aux);
                else
                    response = query.update(em_aux);
                
                if(response <= 0){
                    mensaje_error("Error al guardar la informacion de la empresa");
                    return;
                }
                
                mensaje_error("Informacion guardada correctamente");
                reiniciar_campo();
                vista.col_empresa.setVisible(false);
                vista.col_info.setVisible(false);
                vista.col_direccion.setVisible(false);
                vista.guardar.setVisible(false);
                
            }
                
        }else{
            mensaje_error(msj);
            return;
        }
    
    }
    public void sel_empresa(){
        
        try {
        if(vista.sel_lista_empresa.getSelectionModel().isSelectionEmpty()){
            empresa = null;
            vista.col_empresa.setVisible(true);
            vista.col_info.setVisible(false);
            vista.col_direccion.setVisible(false);
        }else{
            vista.guardar.setVisible(true);
            vista.col_info.setVisible(true);
            vista.col_direccion.setVisible(true);
            lista_fechas = new ArrayList<Calendariofacturacionpracticantes>();
            empresa = ( Empresa ) vista.sel_lista_empresa.getSelectedItem();
            vista.txt_num_socio.setText(empresa.getNumeroSocio());
            vista.txt_raz_comercial.setText(empresa.getRazon_factura());
            vista.txt_raz_empresa.setText(empresa.getRazon_empresa());
            vista.txt_rfc.setText(empresa.getRfc());
            vista.txt_gadm.setText(""+empresa.getPorcentaje_comision());
            vista.sel_banco.setSelectedItem(new Banco(empresa.getFk_bancoId()));
            vista.sel_esq_pago.setSelectedIndex(empresa.getFk_esquemaPagoPracticanteId()-1);;
            vista.sel_gpo_empresa.setSelectedItem(new GpoEmpresas(empresa.getFk_corporativoId()));
            
            vista.chk_seg_pract.setSelected(empresa.getPracticantes_seguro());
            vista.chk_fec_term_abierta.setSelected(empresa.getFechaTerminoAbierta());
            vista.chk_notificacion.setSelected(empresa.getNotificacionesPracticantes());
            vista.chk_suspendida.setSelected(empresa.getSuspendida());
            vista.direccion_view.getDireccion(empresa.getFk_direccionId());
            
        }
            
        } catch (Exception e) {
                empresa = null;
                execute();
                mensaje_error("Error al seleccionar empresa");
        }
    
    }
    
    
    public String validar(){
        int g_adm=0;
        try {
         if(empresa == null){
             if(lista_fechas == null || lista_fechas.isEmpty())
                return "Favor de agregar calendario de facturacion para la empresa";
         }
         if(vista.txt_raz_empresa.getText().trim().equals(""))
             return "Favor de escribir una razon de empresa";
         if(vista.txt_raz_comercial.getText().trim().equals(""))
             return "Favor de escribir una razon comercial";
         if(vista.txt_num_socio.getText().trim().equals(""))
             return "Favor de escribir un numero de socio";
         if(vista.txt_rfc.getText().trim().equals(""))
             return "Favor de escribir el rfc de la empresa";
         if(vista.txt_gadm.getText().trim().equals(""))
             return "Favor de escribir el porcentaje de gasto administrativo";
            try {
                g_adm = Integer.parseInt(vista.txt_gadm.getText().trim());
                if(g_adm <= 0)
                    return "El gasto administrativo debe ser mayor a 0";
                if(g_adm >= 100)
                    return "El gasto administrativo debe ser menor a 100";
            } catch (Exception e) {
                return "Favor de escribir solo valores numericos";
            }
            if(vista.sel_esq_pago.getSelectionModel().isSelectionEmpty()){
                return "Favor de seleccionar un esquema de pago";
            }
            if(vista.sel_banco.getSelectionModel().isSelectionEmpty()){
                return "Favor de seleccionar un banco";
            }
            if(vista.sel_gpo_empresa.getSelectionModel().isSelectionEmpty()){
                return "Favor de seleccionar un grupo de empresa";
            } 
            if( vista.direccion_view.sel_pais.getSelectionModel().isSelectionEmpty())
                return "Favor de seleccionar un Pais";
            if( vista.direccion_view.sel_estado.getSelectionModel().isSelectionEmpty())
                return "Favor de seleccionar un Estado";
            if( vista.direccion_view.sel_ciudad.getSelectionModel().isSelectionEmpty())
                return "Favor de seleccionar una Ciudad";
            if( vista.direccion_view.sel_colonia.getSelectionModel().isSelectionEmpty())
                return "Favor de seleccionar una Colonia";
            if(vista.direccion_view.txt_calle.getText().trim().equals(""))
                return "Favor escribir la calle";
            if(vista.direccion_view.txt_numext.getText().trim().equals("") && vista.direccion_view.txt_numint.getText().trim().equals("") )
                return "Favor escribir un numero interno o externo";
            
        }catch (Exception e) {
            return "Error en el alta o edicion de empresa";
        }
        return null;
    
    }
    
    public void cargar_select(){
        empresas = query.getEmpresas();
        bancos = query.getBancos();
        gpo_empresas = query.getGpoEmpresas();
        esquema_pago = query.getEsquema_pago();
        seguros = query.getAseguradora();
        
        vista.sel_lista_empresa.setModel(new DefaultListModel(empresas.toArray()));
        vista.sel_banco.setModel(new DefaultListModel(bancos.toArray()));
        vista.sel_gpo_empresa.setModel(new DefaultListModel(gpo_empresas.toArray()));
        vista.sel_esq_pago.setModel(new DefaultListModel(esquema_pago.toArray()));
        
        vista.sel_lista_empresa.setSelectedIndex(-1);
        vista.sel_banco.setSelectedIndex(-1);
        vista.sel_gpo_empresa.setSelectedIndex(-1);
        vista.sel_esq_pago.setSelectedIndex(-1);
        if(seguros != null && ! seguros.isEmpty()){
            vista.sel_aseguradora.setModel(new DefaultListModel(seguros.toArray()));
            vista.sel_aseguradora.setEnabled(false);
            vista.sel_aseguradora.setSelectedIndex(0);
        }
        
        
                
    }
    
    public void reiniciar_campo(){
        vista.txt_raz_empresa.setText("");
        vista.txt_raz_comercial.setText("");
        vista.txt_num_socio.setText("");
        vista.txt_gadm.setText("");
        vista.txt_rfc.setText("");
        vista.chk_fec_term_abierta.setSelected(false);
        vista.chk_seg_pract.setSelected(false);
        vista.chk_notificacion.setSelected(false);
        vista.chk_suspendida.setSelected(false);
        cargar_select();
    }
    
    public boolean Lista_Fecha(String fecha){
          Calendariofacturacionpracticantes cf=new Calendariofacturacionpracticantes();
          String f_txt="";
          char [] suites = { '*','D','H','"'};
          int dias=0;
          Date f;
          try {
              fecha = fecha.trim();
              fecha = fecha.replace(suites[3], suites[0]);
              fecha = fecha.replace("*", "'");
              fecha = fecha.replace("'", "");
              String fechas[]=fecha.split(",");
              if(fechas.length != 7)
                    return false;
              for(int i=0;i<fechas.length;i++){
                  f_txt=fechas[i].trim();
                  
                  if( i != 6 ){
                      f = formato_cadena.parse(f_txt);
                  }else{
                      dias = Integer.parseInt(f_txt); 
                  }
                  switch(i){
                    case 0:cf.setDia_limite_aut_fac(formato_cadena.parse(f_txt));break;
                    case 1:cf.setDia_gap(formato_cadena.parse(f_txt));break;
                    case 2:cf.setDia_dispersion(formato_cadena.parse(f_txt));break;
                    case 3:cf.setDia_pago(formato_cadena.parse(f_txt));break;
                    case 4:cf.setDia_inicio(formato_cadena.parse(f_txt));break;
                    case 5:cf.setDia_fin(formato_cadena.parse(f_txt));break;
                    case 6:cf.setDias_a_pagar_periodo(dias);break;
                }    
              }
              lista_fechas.add(cf);
              
            } catch (Exception e) {
                mensaje_error("Error al Cargar los Calendarios");
                return false;
                
            }
          return true;
    
    }
    
    public void mensaje_error(String msj){
        try {
            this.vista.message_window.setVisible(true);
            this.vista.add(this.vista.message_window);
            this.vista.message_window.mensaje_Panel(msj);

        } catch (Exception e) {
        }


    }
    
    public String setEmpresa(){
        em_aux=new Empresa();
        try {
            if(empresa != null)
                em_aux.setEmpresaId(empresa.getEmpresaId());
            else
                em_aux.setEmpresaId(0);
            
            em_aux.setRazon_empresa(vista.txt_raz_empresa.getText().trim());
            em_aux.setRazon_factura(vista.txt_raz_comercial.getText().trim());
            em_aux.setNumeroSocio(vista.txt_num_socio.getText().trim());
            em_aux.setPorcentaje_comision(Integer.parseInt(""+vista.txt_gadm.getText().trim()));
            em_aux.setRfc(vista.txt_rfc.getText().trim());
            em_aux.setFk_esquemaPagoPracticanteId(((Esquemapagopracticante)vista.sel_esq_pago.getSelectedItem()).getEsquemaPagoPracticanteId());
            em_aux.setFk_bancoId(((Banco)vista.sel_banco.getSelectedItem()).getbancoId());
            GpoEmpresas gpo= (GpoEmpresas)vista.sel_gpo_empresa.getSelectedItem();
            em_aux.setFk_corporativoId(gpo.getcorporativoId());
            em_aux.setPracticantes_seguro(vista.chk_seg_pract.isSelected());
            em_aux.setFechaTerminoAbierta(vista.chk_fec_term_abierta.isSelected());
            em_aux.setNotificacionesPracticantes(vista.chk_notificacion.isSelected());
            em_aux.setSuspendida(vista.chk_suspendida.isSelected());
            
        } catch (Exception e) {
            return "Error al cargar los valores ,comunique a su administrador";
        }
        return null;
    }

    
}
